package org.dxy.domain.event.workorder;

import org.dxy.domain.event.AggregateTypeEnum;
import org.dxy.domain.event.DomainEvent;

import java.util.List;

/**
 * 返工工艺路线生成事件
 * <p>
 * 语义：系统基于历史生产数据裁剪出了一个返工用的工艺路线
 * <p>
 * 触发：监听 ReworkOrderCreatedEvent，调用裁剪服务生成
 * <p>
 * 关注者：产线调度上下文
 * <p>
 * 用途：
 * <ul>
 *   <li>为返工工单提供定制化的工艺路线</li>
 *   <li>跳过已经合格的工序，只执行需要返工的工序</li>
 *   <li>优化返工效率和成本</li>
 * </ul>
 * 
 * @author dxy
 * @since 1.0.0
 */
public record ReworkRouteGeneratedEvent(
    /** 返工工单ID */
    Long reworkOrderId,
    /** 返工工单编码 */
    String reworkOrderCode,
    /** 原始工艺路线ID */
    Long originalRouteId,
    /** 裁剪后的工序ID列表 */
    List<Long> stepIds,
    /** 跳过的工序ID列表 */
    List<Long> skippedStepIds,
    /** 裁剪原因/说明 */
    String trimReason
) implements DomainEvent {
    
    @Override
    public Long aggregateId() {
        return reworkOrderId;
    }

    @Override
    public String aggregateType() {
        return AggregateTypeEnum.WORK_ORDER.getKey();
    }

    @Override
    public String eventType() {
        return WorkOrderEventTypeEnum.REWORK_ROUTE_GENERATED.getKey();
    }

    /**
     * 获取工单事件类型枚举
     */
    public WorkOrderEventTypeEnum getWorkOrderEventType() {
        return WorkOrderEventTypeEnum.REWORK_ROUTE_GENERATED;
    }
    
    /**
     * 判断是否有跳过的工序
     * 
     * @return true 如果有工序被跳过
     */
    public boolean hasSkippedSteps() {
        return skippedStepIds != null && !skippedStepIds.isEmpty();
    }
    
    /**
     * 获取需要执行的工序数量
     * 
     * @return 工序数量
     */
    public int getStepCount() {
        return stepIds != null ? stepIds.size() : 0;
    }
    
    /**
     * 获取跳过的工序数量
     * 
     * @return 跳过的工序数量
     */
    public int getSkippedStepCount() {
        return skippedStepIds != null ? skippedStepIds.size() : 0;
    }
}